package com.sinog.biz.service.business.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sinog.biz.mapper.havexml.AbPrisonerMapper;
import com.sinog.biz.mapper.havexml.AbXiaozuMapper;
import com.sinog.biz.mapper.havexml.PrisonerSrMapper;
import com.sinog.biz.mapper.havexml.StaffInfoManageMapper;
import com.sinog.biz.mapper.havexml.SystemCodeMapper;
import com.sinog.biz.mapper.havexml.UploadAppendixFileMapper;
import com.sinog.biz.mapper.havexml.VolunteerManageMapper;
import com.sinog.biz.service.business.BjdxInfoMainService;
import com.sinog.biz.util.CodeUrlUtils;
import com.sinog.biz.util.IdGen;
import com.sinog.core.domain.AbPrisonersResultVo;
import com.sinog.core.domain.AbXiaozuResultVo;
import com.sinog.core.domain.SystemCode;
import com.sinog.core.util.AssemblyConversionUtils;
import com.sinog.core.util.JsonUtil;
import com.sinog.core.util.PageReturnUtil;
import com.sinog.core.util.PhoneUtil;
import com.sinog.core.util.StrUtil;
import com.sinog.core.utilbean.Result;
import com.sinog.core.utilbean.ReturnCode;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @desc 安置帮教管理 - 帮教对象信息管理 - 全部人员管理 - 帮教小组
 * @author sunsf
 * @date 2020-02-07-16:40
 */
@Service
public class BjdxInfoMainServiceImpl extends ServiceImpl<AbPrisonerMapper,AbPrisonersResultVo> implements BjdxInfoMainService {

    @Resource
    private AbPrisonerMapper abPrisonerMapper;
    @Resource
    private AbXiaozuMapper abXiaozuMapper;
    @Resource
    private SystemCodeMapper systemCodeMapper;
    @Resource
    private UploadAppendixFileMapper uploadAppendixFileMapper;
    @Resource
    private StaffInfoManageMapper staffInfoManageMapper;
    @Resource
    private VolunteerManageMapper volunteerManageMapper;
    @Resource
    private PrisonerSrMapper prisonerSrMapper;

    /**
     * 安置帮教管理 - 帮教对象信息管理 - 全部人员管理 - 列表
     * 安置帮教管理 - 帮教工作信息管理 - 救助管理 - 列表
     * 安置帮教管理 - 帮教工作信息管理 - 帮教管理 - 列表
     * @param querykey 搜索条件
     * @param xdkey 吸毒搜索条件
     * @param departid 部门编号
     * @param level level
     * @param orgid 上级单位编号
     * @param xdFlag 是否吸毒
     * @param pinggu 是否重点帮教对象
     * @param pageIndex pageIndex
     * @param pageSize pageSize
     * @param sortField 排序字段
     * @param sortOrder 排序方式
     * @return String
     */
    @Override
    public String getQbryglList(Integer xdFlag,Integer pageIndex,Integer pageSize,String querykey,String xdkey,
                                String departid,String level,String orgid,String pinggu,String sortField,String sortOrder) {
        querykey = StringUtils.equals(querykey,"-1") ? null : querykey;
        xdkey = StringUtils.equals(xdkey,"-1") ? null : xdkey;
        //根据level组装转换参数
        Map<String,Object> searchMap = AssemblyConversionUtils.transferAssembly(level);
        Page<Map<String,String>> page = new Page<>(pageIndex + 1,pageSize);
        List<Map<String,String>> qbryglList = abPrisonerMapper.getQbryglList(page,sortField,sortOrder,querykey,xdkey,departid,level,orgid,xdFlag,pinggu,searchMap);
        page.setRecords(qbryglList);
        return PageReturnUtil.pageReturn(page);
    }

    /**
     * 安置帮教管理 - 帮教对象信息管理 - 全部人员管理 - 设置帮教小组 - 反显工作人员列表
     * @param priNum 服刑人员编号
     * @param departid 部门编号
     * @return List<Map < String,Object>>
     */
    @Override
    public List<Map<String,Object>> getWorkerList(String priNum,String departid) {
        return StrUtil.listToString(staffInfoManageMapper.getWorkerList(priNum,departid));
    }

    /**
     * 安置帮教管理 - 帮教对象信息管理 - 全部人员管理 - 设置帮教小组 - 反显志愿者列表
     * @param priNum 服刑人员编号
     * @param departid 部门编号
     * @return List<Map < String,Object>>
     */
    @Override
    public List<Map<String,Object>> getZyzList(String priNum,String departid) {
        return StrUtil.listToString(volunteerManageMapper.getZyzList(priNum,departid));
    }

    /**
     * 安置帮教管理 - 帮教对象信息管理 - 全部人员管理 - 设置帮教小组 - 反显稳控民警列表
     * @param priNum 服刑人员编号
     * @param departid 部门编号
     * @return List<Map < String,Object>>
     */
    @Override
    public List<Map<String,Object>> getWkmjList(String priNum,String departid) {
        return StrUtil.listToString(staffInfoManageMapper.getWkmjList(priNum,departid));
    }

    /**
     * 安置帮教管理 - 帮教对象信息管理 - 全部人员管理 - 设置帮教小组 - 反显家庭成员
     * @param departid 部门编号
     * @return List<Map < String,Object>>
     */
    @Override
    public List<Map<String,Object>> getFamilyList(String departid) {
        return StrUtil.listToString(prisonerSrMapper.getFamilyList(departid));
    }

    /**
     * 获取帮教小组成员信息
     * @param priNum 服刑人员编号
     * @return List<Map < String,Object>>
     */
    @Override
    public List<Map<String,Object>> getBjxzcyList(String priNum) {
        List<Map<String, Object>> list = abXiaozuMapper.getBjxzcyList(priNum);
        for(Map<String,Object> map : list) {
            Map<String,String> telAndPhone = PhoneUtil.splitTelAndPhone((String)map.get("tel"));
            //帮教小组校验手机号和固话暂时写法-----页面显示undefined
            if("undefined".equals(telAndPhone.get("tel"))) {
                map.put("fixedLine","");
            } else {
                map.put("fixedLine",telAndPhone.get("tel"));
            }
            if("undefined".equals(telAndPhone.get("phone"))) {
                map.put("phone","");
            } else {
                map.put("phone",telAndPhone.get("phone"));
            }
            //补救方法
            if("null".equals(map.get("age"))){
                map.put("age","");
            }
        }
        return list;
    }

    /**
     * 安置帮教管理 - 帮教对象信息管理 - 全部人员管理 - 设置帮教小组 - 待选人员确定
     * @param gzryids gzryids
     * @return List<Map < String,Object>>
     */
    @Override
    public List<Map<String,Object>> getWorkerListByParam(String gzryids) {
        return StrUtil.listToString(staffInfoManageMapper.getWorkerListByParam(StrUtil.getList(gzryids)));
    }

    /**
     * 安置帮教管理 - 帮教对象信息管理 - 全部人员管理 - 设置帮教小组 - 待选人员确定
     * @param zyzids zyzids
     * @return List<Map < String,Object>>
     */
    @Override
    public List<Map<String,Object>> getZyzListByParam(String zyzids) {
        return StrUtil.listToString(volunteerManageMapper.getZyzListByParam(StrUtil.getList(zyzids)));
    }

    /**
     * 安置帮教管理 - 帮教对象信息管理 - 全部人员管理 - 设置帮教小组 - 待选人员确定
     * @param jtcyids jtcyids
     * @return List<Map < String,Object>>
     */
    @Override
    public List<Map<String,Object>> getFamilyListByParam(String jtcyids) {
        String localCode = CodeUrlUtils.getLocalCode();
        return StrUtil.listToString(prisonerSrMapper.getFamilyListByParam(StrUtil.getList(jtcyids),localCode));
    }

    /**
     * 安置帮教管理 - 帮教对象信息管理 - 全部人员管理 - 设置帮教小组 - 待选人员确定
     * @param wkmjids wkmjids
     * @return List<Map < String,Object>>
     */
    @Override
    public List<Map<String,Object>> getWkmjListByParam(String wkmjids) {
        String localCode = CodeUrlUtils.getLocalCode();
        return StrUtil.listToString(staffInfoManageMapper.getWkmjListByParam(StrUtil.getList(wkmjids),localCode));
    }

    /**
     * 安置帮教管理 - 帮教对象信息管理 - 全部人员管理 - 设置帮教小组 - 保存
     * @param priNum 服刑人员编号
     * @param xbjfa xbjfa
     */
    @Override
    public void updateByPriNum(String priNum,String xbjfa) {
        abPrisonerMapper.updateByPriNum(priNum,xbjfa);
    }

    /**
     * 添加/修改工作小组成员
     * @param priNum 服刑人员编号
     * @param data 业务数据
     * @param userid userid
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveXiaozu(String priNum,String data,String userid) {
        Map<String,Object> jsonMap = JsonUtil.toMap(data);
        List<Map<String,Object>> addList = (List<Map<String,Object>>)jsonMap.get("dataAdd");
        List<Map<String,Object>> editList = (List<Map<String,Object>>)jsonMap.get("dataEdit");
        //遍历新添加的小组列表
        for(Map<String,Object> map : addList) {
            AbXiaozuResultVo xiaozu = new AbXiaozuResultVo();
            xiaozu.setPriNum(priNum).setXname((String)map.get("name"))
                  .setXsex((String)map.get("sex"))
                  .setXdanwei((String)map.get("danwei"))
                  .setXdianhua((String)map.get("tel"))
                  .setAdduserid(userid)
                  .setCreateUser((String)jsonMap.get("addusername"))
                  .setXtType((String)map.get("xttype"))
                  .setXusertype((String)map.get("relation"));
            if(StringUtils.isBlank(xiaozu.getId())) {
                xiaozu.setId(IdGen.strid());
            }
            if(null == map.get("age")){
                xiaozu.setXnianling("");
            } else {
                xiaozu.setXnianling(String.valueOf(map.get("age")));
            }
            String parentId = (String)map.get("parentId");
            if(StringUtils.isBlank(parentId)) {
                parentId = IdGen.strid();
            }
            xiaozu.setParentId(parentId);
            xiaozu.insertOrUpdate();
        }
        //遍历需要编辑的小组列表
        for(Map<String,Object> map : editList) {
            map.put("updatetime",new Date());
            map.put("updateuser",jsonMap.get("addusername"));
            abXiaozuMapper.updateInfoById(map);
        }
    }

    /**
     * 删除工作小组成员
     * @param delIds delIds
     */
    @Override
    public void delXiaozuById(List<String> delIds) {
        abXiaozuMapper.delXiaozuById(delIds);
    }

    /**
     * 获取基本信息
     * @param priNum 服刑人员编号
     * @return Result
     */
    @Override
    public Result getBaseInfoByPriNum(String priNum) {
        if(StringUtils.isBlank(priNum)) {
            return Result.failure(ReturnCode.SELECT_FAILED);
        }
        Map<String,Object> abp = abPrisonerMapper.getBaseInfoByPriNum(priNum);
        List<Map<String,Object>> appendixList = uploadAppendixFileMapper.getUploadAppendixFile(null,priNum,"24");
        if(null != appendixList) {
            abp.put("appendixList",appendixList);
        } else {
            abp.put("appendixList",new ArrayList<>(16));
        }
        return Result.success(abp);
    }

    /**
     * 获取基本信息
     * @param priNum 服刑人员编号
     * @return Map<String,Object>
     */
    @Override
    public Map<String,Object> getBaseInfoByPriNumMap(String priNum) {
        return abPrisonerMapper.getBaseInfoByPriNum(priNum);
    }

    /**
     * 安置帮教管理 - 档案管理 - 列表
     * @param pageIndex 当前页
     * @param pageSize 条数
     * @param sortField 排序字段
     * @param sortOrder 排序方式
     * @param querykey 姓名（搜索关键字）
     * @param departid 部门编号
     * @param level 单位级别
     * @param orgid 用户单位编码
     * @param type 资源类型编码
     * @param sfsl 是否失联（搜索关键字）
     * @param inputSource 录入来源 01:司法所补录的解矫人员,05:司法所补录的监狱人员,3.看守所录入的服刑人员,4:接口进入的看守所人员,5:监狱录入的服刑人员,6:接口进入的监狱服刑人员,7:社矫录入的服刑人员,8:接口进入的社矫人员,9:监狱通过excel导入,10:社矫通过excel导入,11:看守所通过excel导入,30:湖南看守所个性化对接
     * @return String
     */
    @Override
    public String getArchivesManagerList(Integer pageIndex,Integer pageSize,String sortField,String sortOrder,
                                         String querykey,String departid,int level,String orgid,String type,String sfsl,String inputSource) {
        Page<Map<String,String>> page = new Page<>(pageIndex + 1,pageSize);
        page = page.setRecords(abPrisonerMapper.getArchivesManagerList(page,sortField,sortOrder,querykey,departid,level,orgid,type,inputSource,sfsl));
        return PageReturnUtil.pageReturn(page);
    }

    /**
     * 获取户籍迁出街道信息
     * @param parentCode 上级编号
     * @param priNum 服刑人员编号
     * @return List<Map < String,Object>>
     */
    @Override
    public List<Map<String,Object>> getQcStreet(String parentCode,String priNum) {
        List<SystemCode> list = systemCodeMapper.selectQcByMap(parentCode,priNum);
        List<Map<String,Object>> arrList = new ArrayList<>(16);
        for(SystemCode l : list) {
            Map<String,Object> m = new HashMap<>(16);
            m.put("code",l.getCodeId());
            m.put("name",l.getCodeName());
            arrList.add(m);
        }
        return arrList;
    }
}